package com.hujing;

import java.util.ArrayList;
import java.util.concurrent.*;

public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 创建线程池,线程池的概念与银行办理业务类似,线程池能同时执行的任务数=最大线程数+等待队列的容量
         * corePoolSize：核心线程数 3
         * maximumPoolSize：最大线程数 5
         * keepAliveTime：线程空闲时间 2秒 线程空闲超过2秒就回收
         * unit：时间单位 TimeUnit.SECONDS
         * workQueue：任务队列，使用ArrayBlockingQueue，容量为3 等候区的容量是3，意思是最多有3个任务在等待被执行
         * threadFactory：线程工厂，使用Executors.defaultThreadFactory()
         * handler：线程饱和策略，使用ThreadPoolExecutor.AbortPolicy()，丢弃任务并抛出RejectedExecutionException异常
         */
        // 优化上面线程池的创建
        int corePoolSize = Runtime.getRuntime().availableProcessors();
        System.out.println("corePoolSize = " + corePoolSize);
        int maximumPoolSize = corePoolSize * 2 + 1;
        ExecutorService executorService = new ThreadPoolExecutor(3, maximumPoolSize, 10, TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        int sum = 0;

        ArrayList<Future> futures = new ArrayList<>();
        for (int i = 0; i < 9; i++) {
            // 这里让线程休眠10毫秒，避免任务数过多，引起程序的OOM
            int finalI = i;
            Future<Integer> future = executorService.submit(() -> finalI);
            futures.add(future);
        }

        // 等待所有任务完成
        for (Future future : futures) {
            int num = (int) future.get();
            sum += num;
        }

        System.out.println("sum = " + sum);
    }
}
